/*
 * pps_bom
 */
package com.pitop.bom.service;

import com.pitop.bom.entity.Bom;
import com.pitop.bom.entity.BomState;
import com.pitop.core.base.BaseSV;

import java.util.List;

/**
 * bom
 *
 * @author berton
 */
public interface BomSV extends BaseSV<Bom, Long> {

    /**
     * 加载一个对象Bom
     *
     * @param id
     * @param code 编码
     * @return Bom
     */
    Bom load(java.lang.Long id, java.lang.String code);

    /**
     * 加载一个对象Bom详情，(将查询关联数据)
     *
     * @param id
     * @param code 编码
     * @return Bom
     */
    Bom get(java.lang.Long id, java.lang.String code);

    /**
     * 加载一个对象Bom 通过id
     *
     * @param id
     * @return Bom
     */
    Bom loadById(java.lang.Long id);

    /**
     * 加载一个对象Bom 通过code
     *
     * @param code 编码
     * @return Bom
     */
    Bom loadByCode(java.lang.String code);

    /**
     * 加载一个对象Bom 通过code
     *
     * @param name 编码
     * @return Bom
     */
    Bom loadByName(java.lang.String name);

    /**
     * 加载一个对象Bom 通过bomCode
     *
     * @param bomCode bom代码
     * @return Bom
     */
    Bom loadByBomCode(java.lang.String bomCode);

    /**
     * 加载一个对象Bom 通过id,(将查询关联数据)
     *
     * @param id
     * @return Bom
     */
    Bom getById(java.lang.Long id);

    /**
     * 加载一个对象Bom 通过code,(将查询关联数据)
     *
     * @param code 编码
     * @return Bom
     */
    Bom getByCode(java.lang.String code);

    /**
     * 根据主键id,oldStates 共同更新 Bom 的状态到newState状态
     *
     * @param id
     * @param newState  新状态
     * @param oldStates 旧状态集合
     */
    void updateStateById(java.lang.Long id, BomState newState, BomState... oldStates);

    /**
     * 根据主键code,oldStates 共同更新 Bom 的状态到newState状态
     *
     * @param code      编码
     * @param newState  新状态
     * @param oldStates 旧状态集合
     */
    void updateStateByCode(java.lang.String code, BomState newState, BomState... oldStates);

    /**
     * 根据主键id 更新 Bom 的状态到另一个状态
     *
     * @param id
     * @param state 状态
     */
    void updateById(java.lang.Long id, BomState state);

    /**
     * 根据主键code 更新 Bom 的状态到另一个状态
     *
     * @param code  编码
     * @param state 状态
     */
    void updateByCode(java.lang.String code, BomState state);

    /**
     * 删除对象Bom
     *
     * @param id @param code 编码
     * @return Bom
     */
    void delete(java.lang.Long id, java.lang.String code);

    /**
     * 查询Bom分页
     *
     * @param bom    bom
     * @param offset 查询开始行
     * @param limit  查询行数
     * @return List<Bom>
     */
    List<Bom> list(Bom bom, int offset, int limit);

    int count(Bom bom);

    /**
     * 查询Bom分页
     *
     * @param id     * @param code  编码
     * @param offset 查询开始行
     * @param limit  查询行数
     * @return List<Bom>
     */
    List<Bom> list(java.lang.Long id, java.lang.String code, int offset, int limit);

    int count(java.lang.Long id, java.lang.String code);

    /**
     * 添加bom信息
     *
     * @param bom     bom信息
     * @param account 账户信息
     * @param code    账户编码
     */
    void save(Bom bom, String account, String code);

    /**
     * 修改bom信息
     *
     * @param bom     bom信息
     * @param account 账户信息
     * @param code    账户编码
     */
    void modify(Bom bom, String account, String code);

    /**
     * 修改状态
     * @param code              组件编码
     * @param state             状态
     */
    void updateState(String code, String state);


    /**
     * 复制状态
     * @param code              组件编码
     * @param account           管理员账户
     * @param accountCode       管理员账户编码
     */
    void copy(String code, String account, String accountCode);

    /**
     * 查询未绑定此成品的bom
     *  @param productCode 成品编码
     * @param name
     * @param bomCode
     * @param offset     当前页
     * @param limit    分页大小   @return
     * */
    List<Bom> queryUnBindProductBomList(String productCode, String name, String bomCode, int offset, int limit);
    Integer countUnBindProductBomList(String productCode, String name, String bomCode);

    /**
     * 查询已绑定此成品的bom
     * @param productCode 成品编码
     * @param name
     * @param bomCode @return
     * @param offset     当前页
     * @param limit    分页大小
     */
    List<Bom> queryBindProductBomList(String productCode, String name, String bomCode, int offset, int limit);
    Integer countBindProductBomList(String projectCode, String name, String bomCode);

    /**
     * 查询未绑定项目的bom
     *
     * @param projectCode 项目编码
     * @param name        bom名称
     * @param bomCode     bom编码
     * @param offset     当前页
     * @param limit    分页大小
     * @return
     */
    List<Bom> queryUnBindProjectBomList(String projectCode, String name, String bomCode, int offset, int limit);
    Integer countUnBindProjectBomList(String projectCode, String name, String bomCode);

    /**
     * 查询已绑定项目的bom
     *
     * @param projectCode 项目编码
     * @param name        bom名称
     * @param bomCode     bom编码
     * @param offset     当前页
     * @param limit    分页大小
     * @return
     */
    List<Bom> queryBindProjectBomList(String projectCode, String name, String bomCode, int offset, int limit);
    Integer countBindProjectBomList(String projectCode, String name, String bomCode);
}
